#include <Arduino.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

//设置你要ESP32S3连接的WIFI名称
#define WIFI_SSID "lckfb"     
//设置你要ESP32S3连接的WIFI密码
#define WIFI_PASS "12345678"

// 定义NTP服务器
const char* ntpServer = "pool.ntp.org";
// 定义时区（以小时为单位，例如：+1或-3）
const long gmtOffset = 8; 
// 定义夏令时（Daylight Saving Time，DST）的偏移量（通常为0或3600秒）
const int daylightOffset = 0;
// 创建UDP实例
WiFiUDP ntpUDP;
// 创建NTP客户端实例
NTPClient timeClient(ntpUDP, ntpServer, gmtOffset * 3600, daylightOffset * 3600);

void setup() 
{
  //初始化串口
  Serial.begin(9600);

  // 连接到Wi-Fi
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  //如果没有连接上串口就一直输出 ...
  //如果连接不上请确保你要连接的WIFI不是5G频段!
  //大部分ESP32系列都只能连接2.4G频段!
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  // 启动NTP客户端
  timeClient.begin();
  // 设置时间同步间隔（以毫秒为单位）
  timeClient.setUpdateInterval(60000); // 1分钟更新一次
}

void loop() {
  // 更新NTP时间
  timeClient.update();

  if (timeClient.getEpochTime() > 0) 
  {
    // 获取成功
    unsigned long epochTime = timeClient.getEpochTime();
    struct tm *ptm = gmtime ((time_t *)&epochTime); 

    //年是至1900年后开始计算,所以我们实际使用得+1900
    int year = ptm->tm_year + 1900;
    //月是从0开始算,所以我们实际使用得+1
    int month = ptm->tm_mon + 1;
    int day = ptm->tm_mday;
    int hour = ptm->tm_hour;
    int minute = ptm->tm_min;
    int second = ptm->tm_sec;

    // 打印时间
    Serial.printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second);
  } else {
    // 获取失败，可以在这里进行重试或错误处理
    Serial.println("Failed to get NTP time");
  }

  delay(1000); // 每1秒尝试一次
}
